﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.nmtc
    蒙特卡罗法求解非线性方程组
    f(double[] x, int n)计算方程组模函数值的函数名。
    参数 x: x[n]存放实数解初值。
    参数 n: 方程组阶数
    参数 b: 均匀分布随机数的端点初值。
    参数 m: 控制调节b的参数。
    参数 eps: 控制精度要求。
    参数 inter: 若程序显示“b调整了100次！迭代不收敛！”，则需调整b和m的值再试。
    */

    public static unsafe string drive_nmtc()
    {
        int i, n, m;
        double b, eps;
        double[] x = new double[3] { 0.0, 0.0, 0.0 };

        b = 2.0;
        m = 50;
        n = 3;
        eps = 0.000001;

        gl.f_xa_n = nmtcf;
        gl.nmtc(x, n, b, m, eps);

        string rs = "";
        rs += gl.html_table("解 X：", x);
        rs += gl.html_table("验证:|F| = ", new double[1] { nmtcf(DPTR(x), n) });

        return rs;
    }

    // 计算方程组模
    private static unsafe double nmtcf(double* x, int n)
    {
        double f, f1, f2, f3;
        //n = n;
        f1 = 3.0 * x[0] + x[1] + 2.0 * x[2] * x[2] - 3.0;
        f2 = -3.0 * x[0] + 5.0 * x[1] * x[1] + 2.0 * x[0] * x[2] - 1.0;
        f3 = 25.0 * x[0] * x[1] + 20.0 * x[2] + 12.0;
        f = Math.Sqrt(f1 * f1 + f2 * f2 + f3 * f3);
        return (f);
    }
}